Для управления раскрытием или закрытием узлов дерева, отображаемого табличным полем, предназначены события Перед разворачиванием и Перед сворачиванием, возникающие, соответственно, перед разворачиванием или сворачиванием узлов дерева. Данные события предоставляются расширениями табличных полей списков справочников, планов видов характеристик, планов счетов и дерева значений. Данные события имеют следующие параметры:
Обработка данных событий может использоваться, например, для ограничения количества раскрываемых узлов или для динамического заполнения дерева значений.
Поясним использование данного события на следующем примере. Пусть существует форма, содержащая табличное поле, отображающее дерево значений. Строками дерева значений являются элементы справочника "Номенклатура". При открытии формы в дерево значений добавляются только строки верхнего уровня, а подчиненные строки добавляются в дерево значений при раскрытии узлов дерева.
Добавление строк в дерево значений происходит в процедуре "ЗаполнитьУзел". В начале данной процедуры определяется коллекция строк дерева значений, в которую будут добавляться подчиненные строки. Если параметр "Строка" имеет значение Неопределено, то будут добавляться строки верхнего уровня, иначе добавляются строки, подчиненные строке, переданной в качестве параметра. Далее формируется запрос к справочнику "Номенклатура" для получения элементов справочника и получается выборка. В качестве параметра данного запроса передается ссылка на родительскую строку или пустая ссылка, если добавляются строки верхнего уровня. Затем полученная выборка обходится и в дерево значений добавляются новые строки. Если добавленная строка является группой справочника, то добавляется еще одна строка, подчиненная добавленной строке. Эта строка является фиктивной и необходима для того, чтобы в табличном поле отображалась пиктограмма раскрытия строки.
Копировать в буфер обменаПроцедура ЗаполнитьУзел(Строка) // Определение параметра "Родитель" для запроса. Если Строка = Неопределено Тогда СтрокиДерева = Дерево.Строки; Родитель = Справочники.Номенклатура.ПустаяСсылка(); Иначе СтрокиДерева = Строка.Строки; Родитель = Строка.Ссылка; КонецЕсли; // Выполнение запроса. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование, | Номенклатура.Ссылка, | Номенклатура.ЭтоГруппа |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Родитель = &Родитель"; Запрос.УстановитьПараметр("Родитель", Родитель); // Заполнение дерева значений. Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Количество() <> 0 Тогда СтрокиДерева.Очистить(); Пока Выборка.Следующий() Цикл СтрокаДерева = СтрокиДерева.Добавить(); СтрокаДерева.Номенклатура = Выборка.Наименование; СтрокаДерева.Ссылка = Выборка.Ссылка; // Если полученная строка является группой, то создаем // фиктивную подчиненную строку. Если Выборка.ЭтоГруппа Тогда ПодстрокаДерева = СтрокаДерева.Строки.Добавить(); ПодстрокаДерева.Номенклатура = "Нет подчиненных"; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры;
Строки верхнего уровня иерархии добавляются в дерево значений при открытии формы. Сделать это можно используя, например, обработчик события Перед открытием формы.
Копировать в буфер обменаПроцедура ПередОткрытием(Отказ, СтандартнаяОбработка) // Добавляем в дерево значений колонку для хранения ссылки Дерево.Колонки.Добавить("Ссылка"); // Заполняем дерево значений строками верхнего уровня иерархии справочника ЗаполнитьУзел(Неопределено); КонецПроцедуры
Подчиненные строки добавляются в дерево значений при обработке события Перед разворачиванием табличного поля.
Копировать в буфер обменаПроцедура ДеревоПередРазворачиванием(Элемент, Строка, Отказ) ЗаполнитьУзел(Строка); КонецПроцедуры
При закрытии узла дерева полезно освободить память, используемую для хранения подчиненных строк дерева значений. Сделать это можно при обработке события Перед сворачиванием табличного поля.
Копировать в буфер обменаПроцедура ДеревоПередСворачиванием(Элемент, Строка, Отказ) Строка.Строки.Очистить(); // Создаем фиктивную подчиненную строку. ПодстрокаДерева = Строка.Строки.Добавить(); ПодстрокаДерева.Номенклатура = "Нет подчиненных"; КонецПроцедуры